/*
 * TrasitStubNet.java
 *
 * 
 */

package it.luigiarpino.alt2jsim.network;

import java.util.Vector;
import java.util.StringTokenizer;
/**
 *
 * @author  Luigi Lorenzo Arpino 534/559
 */
public class TransitStubNet extends it.luigiarpino.alt2jsim.network.Net{
    
    /** Creates a new instance of TrasitStubNet */
    public TransitStubNet(int numOfNode_, int numOfArch_, int scale_, String[] nomiNodi_, int[][] archi_,int[][] posizioneNodi_) {
        super(numOfNode_, numOfArch_, scale_,  nomiNodi_, archi_,posizioneNodi_);
    }
    
    /** NOTA: Restituisce 0 se non ci sono reti transit*/
    public int getNumOfTransitNetwork(){
        Integer max=new Integer(-1);
        for(int i=0;i<this.numOfNode;i++){
            if (this.nomiNodi[i].startsWith("T")){
                Integer num=new Integer(this.nomiNodi[i].substring(this.nomiNodi[i].indexOf(":")+1,this.nomiNodi[i].indexOf(".")));
                if (num.intValue()>max.intValue()){
                    max=num;
                }
            }
        }
        return max.intValue()+1;
    }
    
    
    private boolean isTransitnode(int node_id_){
        String nome=new String(this.nomiNodi[node_id_]);
        if(nome.startsWith("T")){
            return true;
        }
        else{
            return false;
        }
    }
    
    
    private int getTransitNetworkOfNode(int node_id_){
        if (this.isTransitnode(node_id_)){
            String nome=new String(this.nomiNodi[node_id_]);
            Integer num=new Integer(nome.substring(nome.indexOf(":")+1,nome.indexOf(".")));
            return num.intValue();
        }
        else{
            return -1;
        }
    }
    
    
    /** Restituisce l'elenco dei nomi dei nodi di una rete transit
     Es rete =4 */
    public String[] getTransitNameOfNet(String rete){
        Vector vett=new Vector();
        //genero il vettore con i nomi
        for(int i=0;i<this.numOfNode;i++){
            String nodo_corrente=new String(this.nomiNodi[i]);
            if (nodo_corrente.startsWith("T:"+rete+".")){
                //ricorda nome del nodo transit T:0.0
                StringTokenizer st=new StringTokenizer(nodo_corrente);
                st.nextToken(":");
                String nome=st.nextToken();
                if (!vett.contains(nome)){
                    vett.add(nome);
                }
            }
        }
        String[] nomi=new String[vett.size()];
       for (int i=0;i<vett.size();i++){
           nomi[i]=(String)(vett.elementAt(i));
       }
       return nomi;
    }
    
     
    /**Restituisce l'elenco dei nodi di tipo transit
     nella forma 0.0 */
    public String[] getNameOfTransitNode(){
        Vector vett=new Vector();
        //genero il vettore con i nomi
        for(int i=0;i<this.numOfNode;i++){
            String nodo_corrente=new String(this.nomiNodi[i]);
            if (nodo_corrente.startsWith("T:")){
                //ricorda nome del nodo transit T:0.0
                StringTokenizer st=new StringTokenizer(nodo_corrente);
                st.nextToken(":");
                String nome=st.nextToken();
                if (!vett.contains(nome)){
                    vett.add(nome);
                }
            }
        }
        String[] nomi=new String[vett.size()];
        for (int i=0;i<vett.size();i++){
            nomi[i]=(String)(vett.elementAt(i));
        }
        return nomi;
    }
    
    
    /** Resituisce i nomi delle reti stub 
      connesse al nodo di tipo transit "0.0" */
    public String[] getStubNameOfNet(String nodo_){
        Vector vett=new Vector();
        //genero il vettore con i nomi
        for(int i=0;i<this.numOfNode;i++){
            String nodo_corrente=new String(this.nomiNodi[i]);
            if (nodo_corrente.startsWith("S:"+nodo_)){
                //ricorda nome del nodo transit S:0.0_1.4
                StringTokenizer st=new StringTokenizer(nodo_corrente);
                st.nextToken(":");
                st.nextToken("_");
                String nome=st.nextToken(".");
                nome=nome.substring(1);
                if (!vett.contains(nome)){
                    vett.add(nome);
                }
            }
        }
        String[] nomi=new String[vett.size()+1];
        nomi[0]="Nodo Transit "+nodo_;
        for (int i=1;i<vett.size()+1;i++){
           nomi[i]=(String)(vett.elementAt(i-1));
        }
        return nomi;
    }
    
    
    /**Restituisce la matrice delle adiacenze relativa al sottografo
     delle reti stub connesse al nodo di tipo transit "nodo_" */
    public int[][] getStubMatrixOfNode(String nodo_){
        String[] nomiNodi=this.getStubNameOfNet(nodo_);
        int[][] matrix=new int[nomiNodi.length][nomiNodi.length];
        for(int i=0;i<nomiNodi.length;i++){
            for(int j=0;j<nomiNodi.length;j++){
                matrix[i][j]=0;
            }
        }
        for(int i=0;i<nomiNodi.length;i++){
            matrix[0][i]=1;
        }
        return matrix;
    }
    
    
    /**Restituisce la matrice di incidenza di una rete transit indicata
     dal parametro rete Es rete=2*/
    public int[][] getTransitMatrixOfNet(String rete){  
        Vector vett=new Vector();
        //genero il vettore con i nomi
        for(int i=0;i<this.numOfNode;i++){
            String nodo_corrente=new String(this.nomiNodi[i]);
            if (nodo_corrente.startsWith("T:"+rete+".")){
                //ricorda nome del nodo transit T:0.0
                StringTokenizer st=new StringTokenizer(nodo_corrente);
                st.nextToken(":");
                String nome=st.nextToken();
                if (!vett.contains(nome)){
                    vett.add(nome);
                }
            }
        }
        //genero matrice vuota
        int reti=vett.size();
        int[][] matrix=new int[reti][reti];
        for(int i=0;i<reti;i++){
            for(int j=0;j<reti;j++){
                matrix[i][j]=0;
            }
        }
        // riempio la matrice
        for (int i=0;i<this.numOfArch;i++){
            String nodo1=new String(this.nomiNodi[this.archi[i][0]]);
            String nodo2=new String(this.nomiNodi[this.archi[i][1]]);
            if(nodo1.startsWith("T:"+rete+".")&& nodo2.startsWith("T:"+rete+".")){
                //ricorda Esempio di nome del nodo transit T:0.0
                StringTokenizer st=new StringTokenizer(this.nomiNodi[this.archi[i][0]]);
                st.nextToken(":");
                String nodo_source=st.nextToken();
                st=new StringTokenizer(this.nomiNodi[this.archi[i][1]]);
                st.nextToken(":");
                String nodo_dest=st.nextToken();
                matrix[vett.indexOf(nodo_source)][vett.indexOf(nodo_dest)]++;
            }
        }
        //Azzero diagonale principale
        for(int i=0;i<reti;i++){
            matrix[i][i]=0;
        }
        return matrix;
    }
        
    
    public String[] getTransitName(){
        String[] nomi=new String[this.getNumOfTransitNetwork()];
        for(int i=0;i<this.getNumOfTransitNetwork();i++){
            nomi[i]=String.valueOf(i);
        }
        return nomi;
    }
    
    
    /**Restituisce la matrice di incidenza delle reti Transit
    Ogni nodo rappresenta un'intera rete Transit*/
    public int[][] getTransitMatrix(){
        int num_of_net =this.getNumOfTransitNetwork();
        int[][] matrix=new int[num_of_net][num_of_net];
        for(int i=0;i<num_of_net;i++){
            for (int j=0;j<num_of_net;j++){
                matrix [i][j]=0;
            }
        }
        for(int i=0;i<this.numOfArch;i++){
            int nodo_source=this.archi[i][0];
            int nodo_dest=this.archi[i][1];
            if((this.isTransitnode(nodo_source))&& (this.isTransitnode(nodo_dest))){
                int netSource=this.getTransitNetworkOfNode(nodo_source);
                int netDest=this.getTransitNetworkOfNode(nodo_dest);
                matrix[netSource][netDest]=matrix[netSource][netDest]+1;
            }
        }
        for (int i=0;i<num_of_net;i++){
            matrix [i][i]=0;
        }
        return matrix;
    }
    
    
    public String getInfo(){
        String stringa=new String();
        stringa="<HTML>TransitSub network<BR>";
        stringa=stringa+"Numbers of nodes "+this.numOfNode+"<BR>";
        stringa=stringa+"Numbers of links "+this.numOfArch+"<BR>";
        stringa=stringa+"Grid size "+this.scale+" x "+this.scale+"<BR>";
        stringa=stringa+"Number of transit networks "+this.getNumOfTransitNetwork()+"<BR>";
        stringa=stringa+"Number of transit nodes "+this.getNameOfTransitNode().length+"<BR>";
        stringa=stringa+"</HTML>";
        return stringa;
    }
    
    
}
